\section{Константы}

Люди, включая программистов, часто используют круглые числа вроде 10, 100, 1000, в т.ч. и в коде.

Практикующие реверсеры, обычно, хорошо знают их в шестнадцатеричном представлении:
10=0xA, 100=0x64, 1000=0x3E8, 10000=0x2710.

Иногда попадаются константы \TT{0xAAAAAAAA} \\
(0b10101010101010101010101010101010) и
\TT{0x55555555} (0b01010101010101010101010101010101) --- это чередующиеся биты.
Это помогает отличить некоторый сигнал от сигнала где все биты включены (0b1111 \dots) или выключены (0b0000 \dots).

Например, константа \TT{0x55AA} используется как минимум в бут-секторе, \ac{MBR}, 
и в \ac{ROM} плат-расширений IBM-компьютеров.

Некоторые алгоритмы, особенно криптографические, используют хорошо различимые константы, 
которые при помощи \IDA легко находить в коде.

\myindex{MD5}
\newcommand{\URLMD}{http://go.yurichev.com/17110}

Например, алгоритм MD5\footnote{\href{\URLMD}{wikipedia}} инициализирует свои внутренние переменные так:

\begin{verbatim}
var int h0 := 0x67452301
var int h1 := 0xEFCDAB89
var int h2 := 0x98BADCFE
var int h3 := 0x10325476
\end{verbatim}

Если в коде найти использование этих четырех констант подряд --- очень высокая вероятность что эта функция имеет отношение к MD5.

\par
Еще такой пример это алгоритмы CRC16/CRC32, часто, алгоритмы вычисления контрольной суммы по CRC 
используют заранее заполненные таблицы, вроде:

\begin{lstlisting}[caption=linux/lib/crc16.c,style=customc]
/** CRC table for the CRC-16. The poly is 0x8005 (x^16 + x^15 + x^2 + 1) */
u16 const crc16_table[256] = {
	0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
	0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
	0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
	...
\end{lstlisting}

См. также таблицу CRC32: \myref{sec:CRC32}.

В бестабличных алгоритмах CRC используются хорошо известные полиномы, например 0xEDB88320 для CRC32.

\subsection{Магические числа}
\label{magic_numbers}

\newcommand{\FNURLMAGIC}{\footnote{\href{http://go.yurichev.com/17112}{wikipedia}}}

Немало форматов файлов определяет стандартный заголовок файла где используются \IT{магическое число} (magic number)\FNURLMAGIC{}, один или даже несколько.

\myindex{MS-DOS}
Скажем, все исполняемые файлы для Win32 и MS-DOS начинаются с двух символов \q{MZ}\footnote{\href{http://go.yurichev.com/17113}{wikipedia}}.

\myindex{MIDI}
В начале MIDI-файла должно быть \q{MThd}. Если у нас есть использующая для чего-нибудь MIDI-файлы программа,
наверняка она будет проверять MIDI-файлы на правильность хотя бы проверяя первые 4 байта.

Это можно сделать при помощи:
(\IT{buf} указывает на начало загруженного в память файла)

\begin{lstlisting}[style=customasmx86]
cmp [buf], 0x6468544D ; "MThd"
jnz _error_not_a_MIDI_file
\end{lstlisting}

\myindex{\CStandardLibrary!memcmp()}
\myindex{x86!\Instructions!CMPSB}
\dots либо вызвав функцию сравнения блоков памяти \TT{memcmp()} или любой аналогичный код, 
вплоть до инструкции \TT{CMPSB} (\myref{REPE_CMPSx}).

Найдя такое место мы получаем как минимум информацию о том, где начинается загрузка MIDI-файла, во-вторых, 
мы можем увидеть где располагается буфер с содержимым файла, и что еще оттуда берется, и как используется.

\subsubsection{Даты}

\myindex{UFS2}
\myindex{FreeBSD}
\myindex{HASP}

Часто, можно встретить число вроде \TT{0x19870116}, которое явно выглядит как дата (1987-й год, 1-й месяц (январь), 16-й день).
Это может быть чей-то день рождения (программиста, его/её родственника, ребенка), либо какая-то другая важная дата.
Дата может быть записана и в другом порядке, например \TT{0x16011987}.
Даты в американском стиле также популярны, например \TT{0x01161987}.

Известный пример это \TT{0x19540119} (магическое число используемое в структуре суперблока UFS2), это день рождения Маршала Кирка МакКузика, видного разработчика FreeBSD.

\myindex{Stuxnet}
В Stuxnet используется число ``19790509'' (хотя и не как 32-битное число, а как строка), и это привело к догадкам,
что этот зловред связан с Израелем\footnote{Это дата казни персидского еврея Habib Elghanian-а}.

Также, числа вроде таких очень популярны в любительской криптографии, например, это отрывок из внутренностей \IT{секретной функции} донглы HASP3
\footnote{\url{https://web.archive.org/web/20160311231616/http://www.woodmann.com/fravia/bayu3.htm}}:

\begin{lstlisting}[style=customc]
void xor_pwd(void) 
{ 
	int i; 
	
	pwd^=0x09071966;
	for(i=0;i<8;i++) 
	{ 
		al_buf[i]= pwd & 7; pwd = pwd >> 3; 
	} 
};

void emulate_func2(unsigned short seed)
{ 
	int i, j; 
	for(i=0;i<8;i++) 
	{ 
		ch[i] = 0; 
		
		for(j=0;j<8;j++)
		{ 
			seed *= 0x1989; 
			seed += 5; 
			ch[i] |= (tab[(seed>>9)&0x3f]) << (7-j); 
		}
	} 
}
\end{lstlisting}

\subsubsection{DHCP}

Это касается также и сетевых протоколов. 
Например, сетевые пакеты протокола DHCP содержат так называемую \IT{magic cookie}: \TT{0x63538263}. 
Какой-либо код, генерирующий пакеты по протоколу DHCP где-то и как-то должен внедрять в пакет также и эту константу. 
Найдя её в коде мы сможем найти место где происходит это и не только это. 
Любая программа, получающая DHCP-пакеты, должна где-то как-то проверять \IT{magic cookie}, 
сравнивая это поле пакета с константой.

Например, берем файл dhcpcore.dll из Windows 7 x64 и ищем эту константу. 
И находим, два раза: оказывается, эта константа используется в функциях с красноречивыми названиями \\
\TT{DhcpExtractOptionsForValidation()} и \TT{DhcpExtractFullOptions()}:

\begin{lstlisting}[caption=dhcpcore.dll (Windows 7 x64),style=customasmx86]
.rdata:000007FF6483CBE8 dword_7FF6483CBE8 dd 63538263h          ; DATA XREF: DhcpExtractOptionsForValidation+79
.rdata:000007FF6483CBEC dword_7FF6483CBEC dd 63538263h          ; DATA XREF: DhcpExtractFullOptions+97
\end{lstlisting}

А вот те места в функциях где происходит обращение к константам:

\begin{lstlisting}[caption=dhcpcore.dll (Windows 7 x64),style=customasmx86]
.text:000007FF6480875F  mov     eax, [rsi]
.text:000007FF64808761  cmp     eax, cs:dword_7FF6483CBE8
.text:000007FF64808767  jnz     loc_7FF64817179
\end{lstlisting}

И:

\begin{lstlisting}[caption=dhcpcore.dll (Windows 7 x64),style=customasmx86]
.text:000007FF648082C7  mov     eax, [r12]
.text:000007FF648082CB  cmp     eax, cs:dword_7FF6483CBEC
.text:000007FF648082D1  jnz     loc_7FF648173AF
\end{lstlisting}

\subsection{Специфические константы}

Иногда, бывают какие-то специфические константы для некоторого типа кода.
Например, однажды автор сих строк пытался разобраться с кодом, где подозрительно часто встречалось число 12.
Размеры многих массивов также были 12, или кратные 12 (24, итд).
Оказалось, этот код брал на вход 12-канальный аудиофайл и обрабатывал его.

И наоборот: например, если программа работает с текстовым полем длиной 120 байт, значит где-то в коде должна
быть константа 120, или 119.
Если используется UTF-16, то тогда $2 \cdot 120$.
Если код работает с сетевыми пакетами фиксированной длины, то хорошо бы и такую константу поискать в коде.

Это также справедливо для любительской криптографии (ключи с лицензией, итд).
Если зашифрованный блок имеет размер в $n$ байт, вы можете попробовать поискать это число в коде.
Также, если вы видите фрагмент кода, который при исполнении, повторяется $n$ раз в цикле,
это может быть ф-ция шифрования/дешифрования.

\subsection{Поиск констант}

В \IDA это очень просто, Alt-B или Alt-I.

\myindex{binary grep}
А для поиска константы в большом количестве файлов, либо для поиска их в неисполняемых файлах, имеется небольшая утилита
\IT{binary grep}\footnote{\BGREPURL}.

